/*
 * SQLUsuarioDAOFactory.java
 *
 * Created on 7 de noviembre de 2007, 18:50
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package webportlet.model.usuario.dao;

import java.sql.Connection;
import javax.sql.DataSource;
import webportlet.model.usuario.dto.UsuarioDTO;
import webportlet.model.util.ConfigurationParametersManager;
import webportlet.model.util.GeneralOperations;
import webportlet.model.util.InternalErrorException;
import webportlet.model.util.SimpleDataSource;

/**
 *
 * @author Alvarete
 */
public class SQLUsuarioDAOFactory {
    private final static String DAO_CLASS_NAME_PARAMETER =
        "SQLUsuarioDAOFactory/daoClassName";

    private final static Class daoClass = getDAOClass();
    
    private SQLUsuarioDAOFactory() {}
    
    private static Class getDAOClass() {
    
        Class theClass = null;
    
        try {
        
            // Coge los parametros del archivo ConfigurationParameters
            /*
            String daoClassName = //"model.user.StandarSQLUserDAO";
                ConfigurationParametersManager.getParameter(
                    DAO_CLASS_NAME_PARAMETER);
            
            theClass = Class.forName(daoClassName);*/
            theClass = Class.forName("webportlet.model.usuario.dao.StandarSQLUsuarioDAO");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return theClass;
        
    }
    
    public static SQLUsuarioDAO getDAO() throws InternalErrorException {
        
        try {        
            return (SQLUsuarioDAO) daoClass.newInstance();
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    /* 
     * Test code. Uncomment for testing. Test this class and any class
     * implementing "SQLUserDAO".
     */
    public static void main (String[] args) {                                     //
                                                                                  //
        Connection connection = null;                                             //
                                                                                  //
        try {                                                                     //
                                                                                  //
            /* Get a connection. */                                               //
            DataSource dataSource = new SimpleDataSource();                       //
            connection = dataSource.getConnection();                              //
                                                                                  //
            /* Get dao. */                                                        //
            SQLUsuarioDAO dao = SQLUsuarioDAOFactory.getDAO();                    //
                                                                                  //
            /* Test "SQLUsuarioProfileDAO::create". */                            //
            System.out.println("Test for 'SQLUserDAO::create'");                  //
            UsuarioDTO usuarioDTO = new UsuarioDTO("alvaro","alvpass",            //
                    "Alvaro","Torroba","alvarotorroba@hotmail.com");              //
            dao.create(connection, usuarioDTO);                                   //
            System.out.println("usuarioDTO created => " + usuarioDTO);            //
                                                                                  //
            /* Test "SQLUsuarioDAO::exists". */                                   //
            System.out.println("Test for 'SQLUsuarioDAO::exists'");               //
            if (!dao.exists(connection, usuarioDTO.getNickName())) {              //
                throw new Exception("Can not find user with " +                   //
                    "nick = " + usuarioDTO.getNickName());                        //
            }                                                                     //
                                                                                  //
            /* Test "SQLUsuarioDAO::find". */                                     //
            System.out.println("Test for 'SQLUsuarioDAO::find'");                 //
            System.out.println(dao.find(connection,usuarioDTO.getNickName()));    //
                                                                                  //
            /* Test "SQLUserDAO::update". */                                      //
            System.out.println("Test for 'SQLUserDAO::update'");                  //
            usuarioDTO.setNombre("Alvarete");                                     //
            usuarioDTO.setApellido("Torrobilla");                                 //
            usuarioDTO.setEmail("alvaretetorrobilla@hotmail.com");                //
            usuarioDTO.setPassword("newpass");                                    //
            dao.update(connection, usuarioDTO);                                   //
            System.out.println(dao.find(connection, usuarioDTO.getNickName()));   //
                                                                                  //
            /* Test "SQLUsuarioDAO::remove". */                                   //
            System.out.println("Test for 'SQLUsuarioDAO::remove'");               //
            dao.remove(connection, usuarioDTO.getNickName());                     //
                                                                                  //
            if (dao.exists(connection, usuarioDTO.getNickName())) {               //
                throw new Exception("SQLUserDAO::remove failed");                 //
            }                                                                     //
                                                                                  //
            /* Tests OK. */                                                       //
            System.out.println("Tests OK !!!!");                                  //
                                                                                  //
        } catch (Exception e) {                                                   //
            e.printStackTrace();                                                  //
        } finally {                                                               //
            try {                                                                 //
                GeneralOperations.closeConnection(connection);                    //
            } catch (InternalErrorException e) {                                  //
                e.printStackTrace();                                              //
            }                                                                     //
        }                                                                         //
                                                                                  //
    }
    
}
